home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / dev / if_lereg.h < prev    next >
C/C++ Source or Header  |  1990-12-19  |  6KB  |  159 lines

  1.  
  2. /*    @(#)if_lereg.h 1.1 86/09/27 SMI    */
  3.  
  4. /*
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  6.  */
  7.  
  8. /*
  9.  * AMD 7990 LANCE Ethernet controller registers.
  10.  *
  11.  * The LANCE chip saves address pins by accessing
  12.  * several registers with one address pin by first writing the
  13.  * register address to an internal address register, then reading
  14.  * or writing a data register.  To use this safely, care must be
  15.  * taken that the driver isn't reentered between the writing
  16.  * of the address register and the access to the data register,
  17.  * lest the reentered code try to touch the registers and
  18.  * screw up the sequence.
  19.  *
  20.  * There are 4 registers accessible with this scheme, CSR0, CSR1,
  21.  * CSR2, and CSR3.  In normal operation, only CSR0 can be or
  22.  * needs to be accessed, so the driver normally leaves a 0 in the
  23.  * Register Address Port, allowing CSR0 to be accessed simply by
  24.  * accessing the Register Data Port.  During the initialization
  25.  * sequence, when the other CSRs need to be accessed, the appropriate
  26.  * CSR address is written into the address port, and afterwards
  27.  * the 0 is put back in the address port.
  28.  */
  29.  
  30. #define MAXBUF    2000    /* JCM kludge */
  31. #define MINPACKET 64
  32.  
  33. struct le_device {
  34.     u_short    le_rdp;            /* Register Data Port */
  35.     u_short        : 14;        /* Reserved */
  36.     u_short    le_rap    : 2;        /* Register Address Port */
  37. };
  38. #define le_csr le_rdp
  39.  
  40. #define    LE_CSR0        0
  41. #define    LE_CSR1        1
  42. #define    LE_CSR2        2
  43. #define    LE_CSR3        3
  44.  
  45. /*
  46.  * Control and status bits for CSR0.
  47.  * These behave somewhat strangely, but the net effect is that
  48.  * bit masks may be written to the register which affect only
  49.  * those functions for which there is a one bit in the mask.
  50.  * The exception is the interrupt enable, which must be explicitly
  51.  * set to the correct value in each mask that is used.
  52.  *
  53.  * RO - Read Only, writing has no effect
  54.  * RC - Read, Clear.  Writing 1 clears, writing 0 has no effect
  55.  * RW - Read, Write.
  56.  * W1 - Write with 1 only.  Writing 1 sets, writing 0 has no effect.
  57.  *        Reading gives unpredictable data but doesn't hurt anything.
  58.  * RW1 - Read, Write with 1 only.  Writing 1 sets, writing 0 has no effect.
  59.  */
  60.  
  61. #define    LE_ERR        0x8000        /* RO BABL | CERR | MISS | MERR */
  62. #define    LE_BABL        0x4000        /* RC transmitted too many bits */
  63. #define    LE_CERR        0x2000        /* RC No Heartbeat */
  64. #define    LE_MISS        0x1000        /* RC Missed an incoming packet */
  65. #define    LE_MERR        0x0800        /* RC Memory Error; no acknowledge */
  66. #define    LE_RINT        0x0400        /* RC Received packet Interrupt */
  67. #define    LE_TINT        0x0200        /* RC Transmitted packet Interrupt */
  68. #define    LE_IDON        0x0100        /* RC Initialization Done */
  69. #define    LE_INTR        0x0080        /* RO BABL|MISS|MERR|RINT|TINT|IDON */
  70. #define    LE_INEA        0x0040        /* RW Interrupt Enable */
  71. #define    LE_RXON        0x0020        /* RO Receiver On */
  72. #define    LE_TXON        0x0010        /* RO Transmitter On */
  73. #define    LE_TDMD        0x0008        /* W1 Transmit Demand (send it now) */
  74. #define    LE_STOP        0x0004        /* RW1 Stop */
  75. #define    LE_STRT        0x0002        /* RW1 Start */
  76. #define    LE_INIT        0x0001        /* RW1 Initialize */
  77.  
  78. /*
  79.  * CSR1  is   the low 16 bits of the address of the initialization block
  80.  * CSR2  is   the high 8 bits of the address of the initialization block
  81.  *          the high 8 bits of the register must be 0
  82.  * CSR3 mode bits:
  83.  *
  84.  */
  85. #define    LE_BSWP        0x4    /* Byte Swap (on for 68000 byte order) */
  86. #define    LE_ACON        0x2    /* ALE Control (on for active low ALE) */
  87. #define    LE_BCON        0x1    /* Byte Control (see the manual) */
  88.  
  89. /* The address contained in this structure must be longword aligned */
  90. struct le_drp {            /* Descriptor Ring Pointer */
  91.     u_short    drp_laddr;    /* Low 16 bits of ring address */
  92.     u_char    drp_len    : 3;    /* Binary exponent of no. of ring entries */
  93.     u_char        : 5;    /* Reserved */
  94.     u_char    drp_haddr;    /* High 16 bits of ring address */
  95. };
  96.  
  97. /*
  98.  * Initialization Block.  This structure is constructed in memory,
  99.  * and it's address is written into the chip during initialization.
  100.  * The chip then fetches it's initialization info from the structure.
  101.  */
  102. struct le_init_block {
  103.     /* In the normal mode, these 16 bits are all 0 */
  104.     u_short    ib_prom    : 1;    /* Promiscuous Mode */
  105.     u_short            : 7;    /* Reserved */
  106.     u_short    ib_intl    : 1;    /* Internal Loopback */
  107.     u_short    ib_drty    : 1;    /* Disable Retry */
  108.     u_short    ib_coll    : 1;    /* Force Collision */
  109.     u_short    ib_dtcr    : 1;    /* Disable Transmit CRC */
  110.     u_short    ib_loop    : 1;    /* Loopback */
  111.     u_short    ib_dtx    : 1;    /* Disable Transmitter */
  112.     u_short    ib_drx    : 1;    /* Disable Receiver */
  113.  
  114.     /*
  115.      * The bytes must be swapped within the word, so that, for example,
  116.      * the address 8:0:20:1:25:5a is written in the order
  117.      *             0 8 1 20 5a 25
  118.      */
  119.     u_char    ib_padr[6];
  120.  
  121.     u_char    ib_ladrf[8];
  122.  
  123.     struct    le_drp ib_rdrp;    /* Receive Descriptor Ring Pointer */
  124.     struct    le_drp ib_tdrp;    /* Transmit Descriptor Ring Pointer */
  125. };
  126.  
  127. struct    le_md {            /* Message Descriptor */
  128.     u_short    lmd_ladr;    /* Low Order 16 Address Bits */
  129.     u_char    lmd_flags;
  130.     u_char    lmd_hadr: 8;    /* High Order 8 Address Bits */
  131.     u_short    lmd_bcnt;    /* Buffer Byte Count (maximum length) */
  132.     u_short    lmd_mcnt;    /* Message Byte Count (actual length) */
  133. };
  134. #define lmd_flags3 lmd_mcnt    /* for Transmit message descriptor */
  135.  
  136. /* Bits common to both rmds and tmds */
  137. #define    LMD_OWN        0x80    /* Chip owns the descriptor */
  138. #define    LMD_ERR        0x40    /* Error occurred */
  139. #define    LMD_STP        0x02    /* Start of Packet */
  140. #define    LMD_ENP        0x01    /* End of Packet */
  141.  
  142. /* Bits in rmd flags */
  143. #define    RMD_FRAM    0x20    /* Framing error */
  144. #define    RMD_OFLO    0x10    /* Internal Silo Overflowed. Valid if !ENP */
  145. #define    RMD_CRC        0x08    /* CRC Error */
  146. #define    RMD_BUFF    0x04    /* Didn't have a buffer for the packet */
  147. /* bits in tmd flags */
  148. #define    TMD_MORE    0x10    /* More than one retry was needed */
  149. #define    TMD_ONE      0x08    /* Exactly One Retry, valid only if !LCOL */
  150. #define    TMD_DEF      0x04    /* Deferred (net was initially busy) */
  151.  
  152. /* Bits for lmd_errflags */
  153. #define    TMD_BUFF 0x8000        /* Buffer Error (imples underflow too) */
  154. #define    TMD_UFLO 0x4000        /* Underflow Error */
  155. #define    TMD_LCOL 0x1000        /* Late Collision */
  156. #define    TMD_LCAR 0x0800        /* Loss of Carrier */
  157. #define    TMD_RTRY 0x0400        /* More than 16 Retry's */
  158. #define    TMD_TDR     0x003f        /* Time Domain Reflectometry counter mask */
  159.